import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime

# 设置可视化风格
sns.set(style="whitegrid")
plt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 1. 加载数据
user_info = pd.read_csv('user_info_format1.csv')
user_log = pd.read_csv('user_log_format1.csv')

# 2. 数据概览
print("=" * 50)
print("用户属性表概览:")
print(user_info.info())
print("\n用户行为表概览:")
print(user_log.info())


# 3. 缺失值分析
def missing_analysis(df, name):
    """计算并可视化缺失值占比"""
    missing = df.isnull().sum()
    percent = missing / len(df) * 100
    missing_df = pd.DataFrame({
        '缺失数量': missing,
        '缺失占比(%)': percent.round(2)
    })
    print(f"\n{name}缺失值分析:")
    print(missing_df[missing_df['缺失数量'] > 0])

    # 可视化
    if not missing_df[missing_df['缺失占比(%)'] > 0].empty:
        plt.figure(figsize=(10, 4))
        sns.barplot(x=missing_df.index, y='缺失占比(%)',
                    data=missing_df.reset_index())
        plt.title(f'{name}缺失值分布')
        plt.xticks(rotation=45)
        plt.show()


missing_analysis(user_info, "用户属性表")
missing_analysis(user_log, "用户行为表")


# 4. 用户属性分布分析
def plot_user_distribution():
    """可视化用户属性分布"""
    fig, axes = plt.subplots(1, 2, figsize=(14, 6))

    # 年龄分布
    if 'age_range' in user_info:
        age_order = sorted(user_info['age_range'].dropna().unique())
        sns.countplot(data=user_info, x='age_range', order=age_order, ax=axes[0])
        axes[0].set_title('用户年龄分布')
        axes[0].set_xlabel('年龄段')

    # 性别分布
    if 'gender' in user_info:
        gender_map = {0: '未知', 1: '男', 2: '女'}
        user_info['gender_str'] = user_info['gender'].map(gender_map)
        sns.countplot(data=user_info, x='gender_str',
                      order=['男', '女', '未知'], ax=axes[1])
        axes[1].set_title('用户性别分布')
        axes[1].set_xlabel('性别')

    plt.tight_layout()
    plt.show()


plot_user_distribution()


# 5. 用户行为分析
def analyze_user_log():
    """分析用户行为日志"""
    # 转换时间戳为日期格式
    user_log['date'] = pd.to_datetime(user_log['time_stamp'], format='%m%d', errors='coerce')

    # 行为类型分布
    action_map = {0: '点击', 1: '收藏', 2: '加购', 3: '购买'}
    user_log['action_name'] = user_log['action_type'].map(action_map)

    plt.figure(figsize=(10, 6))
    sns.countplot(data=user_log, y='action_name',
                  order=['点击', '收藏', '加购', '购买'])
    plt.title('用户行为类型分布')
    plt.xlabel('数量')
    plt.ylabel('行为类型')
    plt.show()

    # 时间维度分析
    if 'date' in user_log:
        user_log['month'] = user_log['date'].dt.month
        user_log['day'] = user_log['date'].dt.day

        # 月度分布
        plt.figure(figsize=(12, 5))
        sns.countplot(data=user_log, x='month')
        plt.title('用户行为月度分布')
        plt.xlabel('月份')
        plt.ylabel('行为次数')
        plt.show()

        # 日分布
        plt.figure(figsize=(14, 6))
        sns.countplot(data=user_log, x='day')
        plt.title('用户行为日分布')
        plt.xlabel('日期')
        plt.ylabel('行为次数')
        plt.show()


analyze_user_log()


# 6. 商品/商家维度分析
def analyze_entities():
    """分析商品、商家、品牌维度"""
    # 热门商品TOP10
    top_items = user_log['item_id'].value_counts().head(10)

    # 热门商家TOP10
    top_sellers = user_log['seller_id'].value_counts().head(10)

    # 热门品牌TOP10
    top_brands = user_log['brand_id'].value_counts().head(10)

    fig, axes = plt.subplots(3, 1, figsize=(12, 15))

    sns.barplot(y=top_items.index.astype(str), x=top_items.values, ax=axes[0])
    axes[0].set_title('TOP10热门商品')
    axes[0].set_xlabel('行为次数')

    sns.barplot(y=top_sellers.index.astype(str), x=top_sellers.values, ax=axes[1])
    axes[1].set_title('TOP10热门商家')
    axes[1].set_xlabel('行为次数')

    sns.barplot(y=top_brands.index.astype(str), x=top_brands.values, ax=axes[2])
    axes[2].set_title('TOP10热门品牌')
    axes[2].set_xlabel('行为次数')

    plt.tight_layout()
    plt.show()


analyze_entities()


# 7. 用户活跃度分析
def analyze_activity():
    """分析用户活跃度"""
    # 每个用户的行为次数
    user_activity = user_log.groupby('user_id').size().reset_index(name='activity_count')

    plt.figure(figsize=(12, 6))
    sns.histplot(user_activity['activity_count'], bins=50, kde=True, log_scale=True)
    plt.title('用户行为次数分布（对数坐标）')
    plt.xlabel('行为次数（log）')
    plt.ylabel('用户数量')
    plt.show()

    # 统计活跃用户分段
    bins = [0, 1, 5, 10, 20, 50, 100, 500, 1000, float('inf')]
    labels = ['1次', '2-5次', '6-10次', '11-20次', '21-50次', '51-100次', '101-500次', '501-1000次', '1000+次']

    user_activity['activity_level'] = pd.cut(user_activity['activity_count'],
                                             bins=bins,
                                             labels=labels,
                                             right=False)

    level_counts = user_activity['activity_level'].value_counts().sort_index()

    plt.figure(figsize=(12, 6))
    sns.barplot(x=level_counts.index, y=level_counts.values)
    plt.title('用户活跃度分层分布')
    plt.xlabel('行为次数区间')
    plt.ylabel('用户数量')
    plt.xticks(rotation=45)
    plt.show()


analyze_activity()